<?php
/** @name : ModelAbstract.php - @author : theerasak.p - @since : 21 �.�. 2554 1:17:47 - @encoding : UTF-8 */
abstract class ModelAbstract
{
	# ตัวแปรสำหรับส่งค่าไปยังหน้า View
	public $request = array();
	private $dbConnection;
	private $view = array();
	private $state = "insert";
	private $version = 0;

	public function getDBConnection()
	{
		return $this->dbConnection;
	}

	public  function setDBConnection()
	{
		$this->dbConnection = new DB();
	}

	public function setView($var,$data)
	{
		$this->view[$var] = $data;
	}

	public function getView($var)
	{
		return $this->view[$var];
	}

	public  function getDB()
	{
		return $this->database;
	}

	public function getState()
	{
		return $this->state;
	}

	public function setState($state)
	{
		$this->state = $state;
	}

	public function getVersion()
	{
		return $this->version;
	}

	public function setVersion($version)
	{
		$this->version = $version;
	}

	/**
	 * @method ดึงข้อมูล SQL จากไฟล์ XML โดยใส่ค่าให้กับตัวแปร
	 * @param xml_file = ชื่อไฟล์ XML, sql_name = ชื่อ SQL ที่ต้องการดึงจากไฟล์ XML, params = ตัวแปรที่ต้องการส่งไปประมวลผล
	 * @return SQL Command ที่จะใช้ในการประมวลผลกับฐานข้อมูล
	 * @example XMLSQL("Standard","dummy",":dummyId=1");
	 */
	protected function XMLSQL($xml_file,$sql_name,$params)
	{
		$sql = $this->getDBConnection()->XMLSQL($xml_file,$sql_name);
		$sqlForThrow = $sql;

		$paramArray = split(",", $params);
		if(sizeof($paramArray)>0)
		{
			foreach ($paramArray as $param)
			{
				$param = split("=", $param);
				$sql = str_replace($param[0], $param[1], $sql);
			}
		}
		
		if(preg_match("/\:+[a-zA-Z0-9]+/", $sql))
		{
			try
			{
				throw new DatabaseException("การตั้งค่าตัวแปร params ใน XMLSQL ไม่ครบ<br>SQL Command : ".$sqlForThrow."<br>");
			}
			catch (DatabaseException $e)
			{
				$e->execute();
			}
		}

		return $sql;
	}

	/**
	 * @method ดึงค่าข้อมูลจาก Bean
	 * @param var = ชื่อตัวแปร, get = รูปแบบพิเศษที่ต้องการดึง (date)
	 * @return ค่าของตัวแปร
	 * @example $instance->get("dummyName");
	 */
	public function get($var,$get=null)
	{
		if(!empty($this->database['columns'][$var]['value']))
		{
			if(empty($get))
			{
				return $this->database['columns'][$var]['value'];
			}
			else if($get=="date")
			{
				return Util::getDateTime($this->database['columns'][$var]['value'],"date");
			}
		}

		return null;

	}

	/**
	 * @method Set ค่าให้กับตัวแปรใน Bean
	 * @param var = ชื่อตัวแปร, value = ค่าที่ต้องการตั้งค่าให้กับตัวแปร, option = ส่วนเสริม(ว่างได้)
	 * @return ไม่มี
	 * @example $instance->set("dummyName","kook");
	 */
	public function set($var,$value,$option = NULL)
	{
		if(array_key_exists($var, $this->database['columns']))
		{
			$this->database['columns'][$var]['value'] = $value;

			if($option != NULL)
			{
				$this->database['columns'][$var]['operation'] = $option;
			}
		}
		else
		{
			try
			{
				throw new ModelException("ไม่พบชื่อ data member ชื่อ ".$var." ที่ต้องการจะตั้งในไฟล์ Model ของ ".$this->database['name']);
			}
			catch (ModelException $e)
			{
				$e->execute();
			}

		}

	}

	/**
	 * @method Mapping ค่าจากฟอร์มเข้า Bean
	 * @param ไม่มี
	 * @return ไม่มี
	 * @example $instance->mapping();
	 */
	public function mapping()
	{
		foreach($this->database['columns'] as $key => $column)
		{
			$data = (HTML::get($key,METHOD_POST)?HTML::get($key,METHOD_POST):HTML::get($key,METHOD_GET));
			
			if($data)
			{
				if($this->database['columns'][$key]['constraint']['type'] == "date")
				{
					$this->set($key, Date::engDateToSQL($data));
				}
				else if($this->database['columns'][$key]['constraint']['type'] == "integer" && is_numeric($data))
				{
					$this->set($key, intval($data));
				}
				else if($this->database['columns'][$key]['constraint']['type'] == "datetime")
				{
					$this->set($key, Date::thaiDateTimeToSQL($data));
				}
				else
				{
					$this->set($key, $data);
				}
			}
		}
	}
}
?>